package cn.zhaopin.starter.security.service;

import cn.zhaopin.starter.security.basic.UserContext;
import cn.zhaopin.starter.security.wechat.WeChatMpSession;
import cn.zhaopin.starter.security.wechat.WeWork3rdUserInfo;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import reactor.core.publisher.Mono;

import java.util.Map;

/**
 * Description: 自定义userDetailService
 *
 * @author zuomin (myleszelic@outlook.com)
 * @date: 2021/09/28-19:13
 */
public interface SecurityUserDetailService extends ReactiveUserDetailsService {

    @Override
    default  Mono<UserDetails> findByUsername(String s) {
        return  Mono.empty();
    }

    /**
     * 检查绑定设备信息
     * @param phoneNumber 手机号
     * @param deviceUuid 设备uuid
     * @return
     */
    default Boolean checkBindDevice(String phoneNumber, String deviceUuid) {
        return null;
    }

    /**
     * 绑定设备信息
     * @param phoneNumber 手机号
     * @param deviceUuid 设备uuid
     * @param osName 系统名称
     * @param osVersion 系统版本
     * @return
     */
    default Boolean bindDevice(String phoneNumber, String deviceUuid, String osName, String osVersion) {
        return null;
    }

    /**
     * 登陆成功处理方法
     * @param request request
     * @param response response
     * @param auth user
     * @return
     */
    default Void loginSuccessful(Authentication auth) {
        return null;
    }

    /**
     * 获取企业微信用户信息
     * @param code 临时code, 只能用一次
     * @param loginType 登陆方式 {@link cn.zhaopin.starter.security.common.SecurityConstant.LOGIN_TYPE}
     * @return
     */
    default WeWork3rdUserInfo get3rdUserInfo(String code, String loginType) {
        return null;
    }

    /**
     * 保存用户信息
     * @param userTicket 临时ticket
     * @return
     */
    default Boolean save3rdUserDetail(String userTicket) {
        return null;
    }

    /**
     * 获取微信小程序session
     * @param codeReq 临时code
     * @return
     */
    default WeChatMpSession getWeChatMpSession(String codeReq) {
        return null;
    }

    /**
     * 微信小程序用户信息解码
     * @param encryptData 加密数据
     * @param sessionKey 加密key
     * @param iv 偏移量
     * @return
     */
    default Map decryptWeChatMpUserInfo(String encryptData, String sessionKey, String iv) {
        return null;
    }

    /**
     * 根据小程序unionid获取用户信息
     * @param unionId
     * @return
     */
    default UserContext findUserByUnionId(String unionId) {
        return null;
    }

    /**
     * 根据企业微信获取用户信息
     * @param ewCorpId 企业微信corpid
     * @param ewUserId 企业微信userid
     * @return
     */
    default UserContext findUserByWeWork3rdUserId(String ewCorpId, String ewUserId) {
        return null;
    }

    /**
     * 绑定微信小程序手机号
     * @param sessionKey 加密key
     * @param userData 用户信息
     * @param userIv 用户信息偏移量
     * @param phoneData 手机信息
     * @param phoneIv 手机信息偏移量
     * @return
     */
    default UserContext bindWeChatMpPhone(String sessionKey, String userData, String userIv, String phoneData, String phoneIv){
        return null;
    }

    /**
     * 是否支持
     * @param path 路径匹配
     * @return
     */
    default boolean support(String path) {
        return false;
    }

    /**
     * 根据手机号获取用户信息
     * @param phoneNumber 手机号
     * @return user
     */
    default UserContext findUserByPhone(String phoneNumber) {
        return null;
    }
}
